這是在FB的:Taiwan Programming Language Study Group 台灣程式語言讀書會 有人提問,一時手癢就寫了一下,給有需要的人參考:
/*
如何將輸入字串中的句點替換成驚嘆號,原本的驚嘆號換成兩個驚嘆號
*/
#include<stdio.h>
#include <conio.h>
#define BUF_SIZE 50
int main(void){
char ch = '\0';
char src_buf[BUF_SIZE] = {'\0'};
int get_char_count = 0;
printf("輸入一字串,並使用'#'作結束.\n");
printf("輸入字串 :");
while (ch != '#'){
// 為了判斷enter鍵,不能寫在while裡
ch = getch();
if(ch == '\r'){
continue; // pass enter鍵
}
// 輸入'.'置換成'!'
if(ch == '.'){
ch = '!';
// 輸入'!',多存一次
}else if(ch == '!'){
src_buf[get_char_count++] = ch;
printf("%c", ch);
}
/* 1.為了處理enter鍵,故這邊要再判斷一次。
2.不要把'#'存入buffer以及顯示出來。
*/
if(ch != '#'){
src_buf[get_char_count++] = ch;
printf("%c", ch);
}
// 防止輸入長度過長
if(get_char_count >= BUF_SIZE-1){
ch = '#';
src_buf[BUF_SIZE-1] = '\0';
printf(" ...超出buffer長度,");
}
}
printf(" ...輸入結束\n");
printf("列印所存的buffer:%s", src_buf);
return 0;
}
說明:
if(get_char_count >= BUF_SIZE-1){
printf(" ...超出buffer長度,");
src_buf[BUF_SIZE-1] = '\0';
ch = '#';
}
2-1. 也可以寫成==
,但萬一在別的地方更改get_char_count,以至於超過BUF_SIZE,陣列存取就會溢位。src_buf[BUF_SIZE-1] = '\0';
主要是讓buffer最後一個字元固定為字串結束符號'\0',雖不寫在printf("%s",src_buf)
"有時"不會出問題。但還是要謹慎點,讓陣列有字串結束符號。ch = '#';
是讓程式判斷離開。或者寫break;
直接離開while迴圈也是可以。